package com.hmall.common.enums;

import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;

import java.util.*;

/*********************************************************
 ** 通用的枚举接口
 ** <br><br>
 ** @ClassName: CommonEnum
 ** @author: yangfeng
 ** @date: 2024/12/23 15:21
 ** @version: 1.0.0
 *********************************************************/
public interface CommonEnum {
    Integer getCode();

    String getName();
    static <T extends CommonEnum> T getByCode(Integer code, Class<T> tClass) {
        if (ObjectUtil.isNull(code)) {
            return null;
        }
        T[] enumConstants = tClass.getEnumConstants();
        if (ArrayUtil.isEmpty(enumConstants)) {
            return null;
        }
        Optional<T> tOptional = Arrays.stream(enumConstants).filter(o -> code.equals(o.getCode())).findFirst();
        return tOptional.get();
    }
    static <E extends CommonEnum> List<Map<String, Object>> values(Class<?> clzz) {
        Assert.isTrue(clzz.isEnum(), "类型不正确。");
        Assert.isTrue(CommonEnum.class.isAssignableFrom(clzz), "枚举类型继承接口错误。");
        List<Map<String, Object>> list = new ArrayList<>();
        E[] enums = (E[]) clzz.getEnumConstants();
        for (E e : enums) {
            Map<String, Object> map = new LinkedHashMap<>();
            map.put("name", e.getName());
            map.put("code", e.getCode());
            map.put("className", clzz.getName());
            list.add(map);
        }
        return list;
    }

}
